// 导入 express 模块
const express = require("express");
// 导入 cors
const cors = require("cors");

const joi = require("@hapi/joi");
// 解析token字符串
const expressJwt = require("express-jwt");

// 导入配置文件
const config = require("./config");

// 创建 express 的服务器实例
const app = express();
// 配置跨域的中间件
app.use(cors());
// 配置解析表单数据的中间中  appliaction/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }));
// 解析json格式数据的中间件
app.use(express.json());
// 托管静态资源
app.use("/uploads", express.static("./uploads"));

app.use(expressJwt({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }));
// 在此处进行功能开发

// 在所有路由之前，封装 res.cc 函数
app.use((req, res, next) => {
  // status 的默认值为 1，表示失败的情况  0表示成功
  // err 的值，可能是一个错误对象，也可能是一个错误的描述字符串
  res.cc = (err, status = 1) => {
    res.send({
      status,
      message: err instanceof Error ? err.message : err
    });
  };

  next();
});

// 导入并注册用户路由模块
app.use("/api", require("./router/user"));
app.use("/my", require("./router/userinfo"));
app.use("/my/article", require("./router/artcate"));
app.use("/my/article", require("./router/article"));

// 错误中间件
app.use((err, req, res, next) => {
  // 数据验证失败
  if (err instanceof joi.ValidationError) return res.cc(err);
  // 捕获身份认证失败的错误
  if (err.name === "UnauthorizedError") return res.send({ status: 1, message: "身份认证失败" });
  //   if (err.name === "UnauthorizedError") return res.cc('身份认证失败1');
  // 未知错误
  res.cc(err);
});

// 指定端口并启动 web 服务器
app.listen(3007, () => {
  console.log("api server running at http://127.0.0.1:3007");
});
